package cn.dlc.com.config;

import java.util.ArrayList;
import java.util.List;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;
import org.apache.zookeeper.CreateMode;

/**
 * 服务提供者
 * @author Administrator
 *
 */
public class ServerProvider {
	
	// 用来存放服务列表
	private List<String> serviceList = new ArrayList<String>();
		
	// zookeeper操作对象
	private ZkClient zkClient;
	
	public ServerProvider() {}
	/**
	 * 初始化的时候创建节点
	 * @param zkUrl zookeeper的地址
	 * @param nodePath 主节点
	 * @param serverName 里面的服务列表
	 */
	public ServerProvider(String zkUrl, String nodePath){
		// 初始化的时候创建服务器的节点，并且注册服务
		zkClient = new ZkClient(new ZkConnection(zkUrl));
		if(!zkClient.exists(nodePath)) {
			// 创建一个持久化的主节点
			zkClient.create(nodePath, "this is fuzaijunheng", CreateMode.PERSISTENT);
		}
	}
	
	/**
	 * 注册服务
	 * @param nodePath 注册服务器的主节点
	 * @param serverName 注册服务的名称
	 * @param serverUrl 注册服务的真实地址（也是内容）
	 */
	public void registServer(String nodePath,String serverName,String serverUrl) {
		if(!zkClient.exists(nodePath + serverName)) {
			zkClient.create(nodePath + serverName, "servers list", CreateMode.PERSISTENT);
		}
		// 有节点的话直接创建临时节点，
		zkClient.createEphemeral(nodePath + serverName + "/" + serverUrl, serverUrl);
		System.out.println("【创建节点：" + nodePath + serverName + "/" + serverUrl + "】");
	}
	
	/**
	 * 获取服务列表
	 * @param nodePath 节点
	 * @param serverName 节点里面的子节点
	 * @return
	 */
	public List<String> getServersList(String nodePath, String serverName) {
		serviceList = zkClient.getChildren(nodePath + serverName);
		// 监听这个节点列表的变化
		zkClient.subscribeChildChanges(nodePath + serverName, new IZkChildListener() {
			// 如果节点列表发生变化，重新修改serviceList
			@Override
			public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
				System.out.println("获取到的服务列表： ");
				for (String string : currentChilds) {
					System.out.println(string);
				}
				System.out.println("获取到的服务列表end");
				
				serviceList = currentChilds;
			}
		});
		return serviceList;
	}
}
